import {Body, Controller, Get, Post, Query, Render, Request, Response} from '@nestjs/common';
import {UsersService} from "../../../../service/users/users.service";
import {ToolsService} from "../../../../service/tools/tools.service";

@Controller('admin/users')
export class UsersController {
    constructor(
        private readonly usersService: UsersService,
        private readonly toolsService: ToolsService
    ) {
    }

    // 查询用户列表
    @Get()
    @Render('users')
    async list() {
        // 调用 usersService 的 findAll 方法获取用户列表和总数
        const [list, count] = await this.usersService.findAll();

        // 返回用户列表和总数，用于渲染 users 模板
        return {
            list,
            count
        }
    }

    // 查询用户详细信息
    @Get('userinfo')
    @Render('userinfo')
    async userinfo(@Query() query) {
        // 如果查询参数中没有 id，返回空对象
        if (!query.id) return {info: {}};

        // 调用 usersService 的 findDetail 方法，根据 id 查询用户详细信息
        const infoArray = await this.usersService.findDetail(query.id);

        // 返回用户信息，用于渲染 userinfo 模板
        return {info: infoArray[0]}
    }

    // 添加用户
    @Post('add')
    async add(@Body() body, @Response() res, @Request() req) {
        // 从请求体中获取用户名、密码、昵称和邮箱
        const {username, password, nickname, email} = body;

        // 检查用户名是否已存在
        const isExist = await this.usersService.findOne({username});
        if (isExist && isExist.username) {
            // 如果用户名已存在，返回错误提示并重定向到用户信息页面
            await this.toolsService.tips(res, {
                type: 'error',
                message: '当前用户名已存在',
                redirectUrl: `/admin/users/userinfo`
            })
            return;
        }

        // 检查表单是否填写完整
        if (!Object.values(body).filter(it => it).length) {
            // 如果表单未填写完整，返回错误提示并重定向到用户信息页面
            await this.toolsService.tips(res, {
                type: 'error',
                message: '请将表单每一项填写完整',
                redirectUrl: `/admin/users/userinfo`
            })
            return;
        }

        // 对密码进行 MD5 加密
        const pwd = await this.toolsService.getMd5(password);

        // 调用 usersService 的 save 方法保存用户信息
        const resp = await this.usersService.save({
            username, password: pwd, nickname, email
        });

        // 根据保存结果返回提示信息
        if (resp) {
            await this.toolsService.tips(res, {
                type: 'success',
                redirectUrl: '/admin/users',
            })
        } else {
            await this.toolsService.tips(res, {
                type: 'error',
                message: '修改失败，请稍后重试',
                redirectUrl: '/admin/users',
            })
        }
    }

    // 编辑用户信息
    @Post('editUserinfo')
    async editUserinfo(@Body() body, @Response() res, @Request() req) {
        // 从请求体中获取用户 id
        const {id} = body;

        // 构建更新对象，过滤掉空值并对密码进行 MD5 加密
        const obj = {};
        Object.entries(body).forEach(it => {
            const [key, value = ''] = it;
            if (value) {
                if (key === 'password') obj[key] = this.toolsService.getMd5(value)
                else obj[key] = value
            }
        });

        // 调用 usersService 的 update 方法更新用户信息
        const resp = await this.usersService.update(id, obj);

        // 根据更新结果返回提示信息
        if (resp) {
            const arg = {
                type: 'success',
                redirectUrl: '/admin/users',
            };

            // 如果当前登录用户修改了自己的信息，清空 session 并提示重新登录
            if (Number(req.session.userinfo.id) === Number(id)) {
                req.session.userinfo = null;
                Object.assign(arg, {
                    redirectUrl: '/admin/auth/login',
                    message: '已修改用户信息，请重新登录！'
                })
            }

            await this.toolsService.tips(res, arg)
        } else {
            await this.toolsService.tips(res, {
                type: 'error',
                message: '修改失败，请稍后重试',
                redirectUrl: `/admin/auth/userinfo?id=${id}`
            })
        }
    }

    // 删除用户
    @Get('delete')
    async del(@Query() query, @Response() res) {
        // 调用 usersService 的 del 方法删除用户
        const resp = await this.usersService.del(query.id);

        // 根据删除结果返回提示信息
        if (resp) {
            await this.toolsService.tips(res, {
                type: 'success',
                redirectUrl: '/admin/users',
            })
        } else {
            await this.toolsService.tips(res, {
                type: 'error',
                message: '删除失败，请稍后重试',
                redirectUrl: '/admin/users',
            })
        }
    }
}
